Não sou nenhum expert ou grande conhecedor da linguagem AWK, mas ela é muito útil e me ajudou muito nas provas sobre Shell Script na faculdade. Por isso resolvi escrever este pequeno e introdutório tutorial acerca dessa linguagem. É bom todo usuário Linux saber usá-la. =)
AWK é uma linguagem utilizada para processamento de informações em texto, como o conteúdo de um arquivo – principalmente informações em colunas – ou a saída de outros comandos, como cat, grep etc.
NOTA: O conteúdo deste post foi aprimorado e somado a diversos outros temas ligados à Programação usando Shell Script. Tudo isso resultou no curso “Shell Script Para Programadores“. Conheço melhor o curso neste link.
A estrutura de um script AWK (pode estar em um arquivo ou ser escrito diretamente na linha de comando – Shell) é a seguinte:
1 2 3 4 5 6 7 8 9 10 11 | BEGIN{ Comandos executados ao iniciar o processamento, antes de ler as linhas do texto } [condicao]{ Comandos a serem executados em todas as linhas do texto } END{ Comando final. Executado após o processamento de todas as linhas } |
A condição do segudo bloco é opcional. Se não especificada, os respectivos comandos do bloco serão executados em todas as linhas. Caso contrário, serão executados apenas nas linhas que satisfizerem a condição.
A condição pode ser uma expressão regular. Basta colocá-la entre barras:
1 2 3 | /^A/{ Comando... } |
Se um bloco de comandos estiver vazio, é executado print $0, ou seja, imprime a linha corrente.
Algumas variáveis definidas no AWK:
FS -> separador de campos
NR -> número da linhas
NF -> número de campos na linha
Para mais informações:
Manpage do AWK: $ man awk
http://www.gnu.org/software/gawk/manual/gawk.html
http://en.wikipedia.org/wiki/Awk
Exemplos:
Filtra as linhas com o padrão especificado. Linhas que terminam com conf
1 | ls -l /etc | awk /conf$/ |
Usando outro separador de campos e imprimindo colunas
1 | cat /etc/passwd | awk -F: '{print $1}' |
Usando separador de campos
1 | ls -l /etc |awk '{print $1 FS $8}' |
Numerando linhas
1 | ls -l /etc | awk '{print NR FS$1 FS $8}' |
Filtra linhas com padrão especificado e mostra apenas as colunas 1 e 8.
1 | ls -l /etc | awk '/conf$/{print $1" "$8}' |
Imprime as linhas com mais de 3 campos. Elimina a primeira linha do ls -l (Total)
1 | ls -l /etc | awk 'NF > 3' |
Filtra linhas com arquivos cujos nomes possuem menos de 5 caracteres
1 | ls -l /etc | awk 'length($8) < 5' |
Imprime linhas pares
1 | ls -l /etc | awk 'NR % 2 == 0 {print NR" "$0}' |
Substitui strings
1 | ls -l /etc | awk '{sub(/conf$/,"test"); print $0}' |
Procura expressão em determinado campo
1 | ls -l /etc | awk '$8 ~ /^[ae]/' |
Inserindo strings entre campos
1 | cat /etc/passwd | awk -F: '{print "Login: " $1}' |
Filtra a saída de ls -l, a fim de mostrar o nome do arquivo, suas permissões e seu tamanho (a condição NR != 1 evita que a linha Total seja exibida):
1 | ls -l | awk 'NR != 1{print "Nome: "$8" Perm: "$1" Tamanho: "$5}' |
Imprime o comprimento da maior linha
1 | awk '{ if (length($0) > max) max = length($0)}; END { print max}'; arquivo |
Imprime as linhas com mais de 42 caracteres
1 | awk 'length($0) > 42' arquivo |
Exibe o número de linhas do arquivo
1 | awk 'END { print NR }' arquivo |
Dicas de Livros e Cursos
Um excelente eBook, que comtempla o AWK e também o SED (outra excelente linguagem) é o SED And AWK Pocket Reference. Aproveite a versão digital, que pode ser lida em qualquer dispositivo usando o aplicativo Kindle, da Amazon.
Para aprender mais sobre Comandos Linux e Shell Script, veja meu curso Shell Script Para Programadores.
Roberto Beraldo
Latest posts by Roberto Beraldo (see all)
- Não Tenha Preguiça de Ler! - 25/04/2016
- Como Atualizar Scripts PHP de MySQL Para MySQLi - 29/10/2015
- Como usar PDO com banco de dados MySQL - 10/09/2015